package com.qf.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qf.model.Student;
import com.qf.service.StuService;
import com.qf.util.R;
import com.qf.vo.StudentVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;

/**
 * 天--道--酬--勤
 *
 * @author LiangGaoQiang
 * @ClassName StuController
 * @Date: 2025/4/8 19:21
 * @Description: 描述
 */

@RestController
@Api(tags = "学生信息管理")
public class StuController {
    @Autowired
    private StuService stuService;


    /**
     * 根据id查询学生信息
     *
     * @param id 学生id
     * @return 学生信息
     */
    @RequestMapping("/getStuById")
    @ApiOperation(value = "根据id查询学生信息", notes = "根据id查询学生信息")
    public R getStuById(int id) {
        Student student = stuService.getStuById(id);
        if (student == null) {
            return R.fail();
        }
        return R.ok(student);
    }


    /**
     * 查询所有学生对象
     *
     * @return 学生对象集合
     */
    @GetMapping("/findAllStu")
    @ApiOperation(value = "查询所有学生对象", notes = "查询所有学生对象")
    public R findAllStu() {
        List<Student> studentList = stuService.findAllStu();
        if (studentList.isEmpty()) {
            return R.fail();
        }
        return R.ok(studentList);

    }


    /**
     * 需求: 模拟搜索框根据年龄或者姓名查询学生
     *
     * @param map 包含年龄和姓名的map
     * @return 学生对象集合
     * 当参数类型是集合时，需要使用@RequestParam注解，否则会报错
     */
    @RequestMapping("/findStuByNameOrAge")
    @ApiOperation(value = "模拟搜索框根据年龄或者姓名查询学生", notes = "模拟搜索框根据年龄或者姓名查询学生")
    public R findStuByNameOrAge(@RequestParam HashMap<String, Object> map) {
        List<Student> studentList = stuService.findStuByNameOrAge(map);
        if (studentList.isEmpty()) {
            return R.fail();
        }
        return R.ok(studentList);
    }


    /**
     * 插入学生信息
     *
     * @param student 学生对象
     * @return 成功或者失败
     */
    @PostMapping("/addStu")
    @ApiOperation(value = "插入学生信息", notes = "插入学生信息")
    public R addStu(Student student) {
        boolean flag = stuService.addStu(student);
        if (flag) {
            return R.ok();
        }
        return R.fail();
    }


    /**
     * 修改学生信息
     *
     * @param student 学生对象
     * @return 成功或者失败
     */
    @PutMapping("/updateStu")
    @ApiOperation(value = "修改学生信息", notes = "修改学生信息")
    public R updateStu(Student student) {
        boolean flag = stuService.updateStuById(student);
        if (flag) {
            return R.ok();
        }
        return R.fail();
    }


    /**
     * 根据学生id，更新学生部分信息
     *
     * @param student 学生对象
     * @return 成功或者失败
     */
    @PutMapping("/updateStuPartInfo")
    @ApiOperation(value = "根据学生id，更新学生部分信息", notes = "根据学生id，更新学生部分信息")
    public R updateStuPartInfo(Student student) {
        boolean flag = stuService.updateStuPartInfo(student);
        if (flag) {
            return R.ok();
        }
        return R.fail();
    }


    /**
     * 根据学生id，删除学生信息
     *
     * @param id 学生id
     * @return 成功或者失败
     */
    @DeleteMapping("/deleteStuById")
    @ApiOperation(value = "根据学生id，删除学生信息", notes = "根据学生id，删除学生信息")
    public R deleteStuById(int id) {
        boolean flag = stuService.deleteStuById(id);
        if (flag) {
            return R.ok();
        }
        return R.fail();
    }


    /**
     * 根据学生id集合，批量删除学生信息
     *
     * @param ids 学生id集合
     * @return 成功或者失败
     */
    @DeleteMapping("/deleteStuByListId")
    @ApiOperation(value = "根据学生id集合，批量删除学生信息", notes = "根据学生id集合，批量删除学生信息")
    public R delteStuByListId(@RequestParam List<Integer> ids) {
        boolean flag = stuService.deleteStuByListId(ids);
        if (flag) {
            return R.ok();
        }
        return R.fail();
    }


    /**
     * 查询所有学生对象，并显示班级信息
     *
     * @return 学生对象集合
     */
    @GetMapping("/findAllStuAndClassInfo")
    @ApiOperation(value = "查询所有学生对象，并显示班级信息", notes = "查询所有学生对象，并显示班级信息")
    public R findAllStuAndClassInfo() {
        List<Student> studentList = stuService.findAllStuAndClassInfo();
        if (studentList.isEmpty()) {
            return R.fail();
        }
        return R.ok(studentList);
    }


    /**
     * 根据学生id，查询单个学生信息和对应的所有科目信息
     *
     * @param id 学生id
     * @return 学生对象集合
     */
    @GetMapping("/findStuInfoAndAllSubjectByStuId")
    @ApiOperation(value = "根据学生id，查询单个学生信息和对应的所有科目信息", notes = "根据学生id，查询单个学生信息和对应的所有科目信息")
    public R findStuInfoAndAllSubjectByStuId(int id) {
        List<Student> studentList = stuService.findStuInfoAndAllSubjectByStuId(id);
        if (studentList.isEmpty()) {
            return R.fail();
        }
        return R.ok(studentList);
    }


    /**
     * 需求: 实现分页查询学生信息
     *
     * @param pageNum  页码
     * @param pageSize 每页显示的数量
     * @return 学生对象集合
     */
    @GetMapping("/findAllStuByPage")
    @ApiOperation(value = "实现分页查询学生信息", notes = "实现分页查询学生信息")
    public R findAllStuByPage(int pageNum, int pageSize) {
        // 开启分页查询
        PageHelper.startPage(pageNum, pageSize);
        // 查询所有学生信息
        List<Student> studentList = stuService.findAllStu();

        // 关闭分页查询
        PageInfo<Student> pageInfo = new PageInfo<Student>(studentList);
        // 判断是否为空
        if (studentList.isEmpty()) {
            return R.fail();
        }
        return R.ok(pageInfo);

    }


    /**
     * 根据id查询1个学生信息以及关联的所有学科信息以及每个学科关联的老师信息
     * @param id 学生id
     * @return 学生对象集合
     */
    @GetMapping("/findStuInfoAndAllSubjectInfoAndAllTeacherInfoByStuId")
    @ApiOperation(value = "根据id查询1个学生信息以及关联的所有学科信息以及每个学科关联的老师信息", notes = "根据id查询1个学生信息以及关联的所有学科信息以及每个学科关联的老师信息")
    public R findStuInfoAndAllSubjectInfoAndAllTeacherInfoByStuId(int id){
        StudentVO studentVO = stuService.findStuInfoAndAllSubjectInfoAndAllTeacherInfoByStuId(id);
        if(studentVO == null){
            return R.fail();
        }
        return R.ok(studentVO);
    }


    /**
     * 根据id查询1个学生信息以及关联的班级信息
     * @param id 学生id
     * @return 学生对象集合
     */
    @GetMapping("/findStuInfoAndClassInfoByStuId")
    @ApiOperation(value = "根据id查询1个学生信息以及关联的班级信息", notes = "根据id查询1个学生信息以及关联的班级信息")
    public R findStuInfoAndClassInfoByStuId(int id) {
        StudentVO studentVO = stuService.findStuInfoAndClassInfoByStuId(id);
        if (studentVO == null){
            return R.fail();
        }
        return R.ok(studentVO);
    }


    /**
     * 根据id查询1个学生信息以及关联的所有学科信息
     * @param id 学生id
     * @return 学生个人信息以及关联的所有学科信息
     */
    @GetMapping("/findSingleStuInfoAndSubjectInfoByStuId")
    @ApiOperation(value = "根据id查询1个学生信息以及关联的所有学科信息", notes = "根据id查询1个学生信息以及关联的所有学科信息")
    public R findSingleStuInfoAndSubjectInfoByStuId(int id) {
        StudentVO studentVO = stuService.findSingleStuInfoAndSubjectInfoByStuId(id);
        if (studentVO == null){
            return R.fail();
        }
        return R.ok(studentVO);
    }
}
